package com.iot08.api.interceptor;

import com.iot08.api.processor.RenamingProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0
 * @Description: 拦截器配置
 * @author: Rock
 * @time: 2021/1/9 16:31
 */
@Configuration
public class WebMvcConfigure extends WebMvcConfigurationSupport {

    @Bean
    public TokenInterceptor getTokenInterceptor() {
        return new TokenInterceptor();
    }

    @Bean
    public CheckImeiInterceptor getCheckImeiInterceptor() {
        return new CheckImeiInterceptor();
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON, MediaType.TEXT_XML, MediaType.APPLICATION_XML);
    }

    /**
     * 拦截器注册添加
     *
     * @param registry
     * @time: 2021/1/9 16:36
     * @author: Rock
     * @version 1.0
     */
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //token检查拦截
        registry.addInterceptor(getTokenInterceptor()).addPathPatterns("/**").excludePathPatterns(getTokenExclude());

        //设备检查拦截
        registry.addInterceptor(getCheckImeiInterceptor()).addPathPatterns(getCheckImeiInterceptorUrl());

        super.addInterceptors(registry);
    }

    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(renamingProcessor());
        super.addArgumentResolvers(argumentResolvers);
    }

    @Bean
    protected RenamingProcessor renamingProcessor() {
        return new RenamingProcessor(true);
    }


    /**
     * 不需要token拦截的URL
     *
     * @time: 2021/1/19 18:24
     * @author: Rock
     * @version 1.0
     */
    private String[] getTokenExclude() {
        List<String> url = new ArrayList<>();
        //第三方登录
        url.add("/getway/accounts/thirdlogin");
        url.add("/getway/accounts/bindPhone");
        //获取国家编码
        url.add("/getway/accounts/country");
        url.add("/getway/accounts"); //POST 的是旧的第三方登录接口
        url.add("/getway/accounts/otherLogin"); //新第三方登录
        url.add("/getway/accounts/register");
        url.add("/getway/accounts/registerLast");
        url.add("/getway/accounts/login");
        url.add("/getway/accounts/loginLast");

        url.add("/getway/accounts/passwordAuth");
        url.add("/getway/accounts/phoneOrEmailAuth");
        url.add("/getway/accounts/resetPassword");
        url.add("/getway/accounts/resetPasswordLast");
        url.add("/getway/accounts/accountExists");
        url.add("/getway/accounts/cancel");
        url.add("/getway/accounts/{openid}/logout");
        //安卓的没传accesstoken
        url.add("/getway/accounts/{openid}/after");
        //赛诺的微信公众后台
        url.add("/getway/accounts/wx_login");
        url.add("/getway/devices/{imei}");

        url.add("/getway/devicetoken/{devicetoken}/related-account");
        url.add("/getway/feedback");
        url.add("/getway/notice_payment_with_dev");
        url.add("/getway/logupdate_interface");
        url.add("/getway/setuuidwithgetlog");
        url.add("/getway/update/android");
        url.add("/getway/version");
        url.add("/getway/reset/**");
        url.add("/getway/open-interface/getdatalist");
        url.add("/getway/download/**");
        url.add("/getway/course/list");
        // CMS内部调用，全部加入了白名单
        url.add("/getway/admin/internal/**");

        url.add("/getway/wxOauth/**");
        url.add("/getway/wxChat/**");
        url.add("/getway/wxofficialaccount/**");
        url.add("/getway/wxSmallProgram/getWxSmallProgramUnionid");
        url.add("/getway/wxSmallProgram/getwxacodeunlimit");
        //小程序的语音转换
        url.add("/getway/wxSmallProgram/getaudio");
        url.add("/getway/util/**");

        //支付回调
        url.add("/getway/accounts/alipay_payment");
        url.add("/getway/accounts/wx_payment");
        url.add("/getway/accounts/wx_refund");
        url.add("/getway/accounts/apple_payment");
        //url.add("/getway/accounts/alipay_refund");
        url.add("/getway/systemLimit/add");
        url.add("/getway/systemLimit/edit");

        url.add("/20000/devices/{imei}/authcode");

        //腾讯设备微信获取SDK签名
        url.add("/getway/watchWxSDKSign");
        //腾讯设备QQ 获取信息的接口
        url.add("/getway/qqlogin/watch/**");
        //腾讯设备QQ 推送对接
        url.add("/getway/qq/watch/**");

        //对外开放接口
        url.add("/getway/open-interface/**");

        //阿里云内容审核回调接口
        url.add("/getway/aliCSBack/**");
        url.add("/getway/accounts/sendSms");
        url.add("/getway/complaint/addComplainReason");
        //url.add("/getway/devices/{imei}/cmsg");

        String[] tokenExcludeArray = new String[url.size()];
        url.toArray(tokenExcludeArray);
        return tokenExcludeArray;
    }

    /**
     * 设备号检查拦截url 检查预留省电和流量断开的情况
     *
     * @time: 2021/1/9 16:37
     * @author: Rock
     * @version 1.0
     */
    private String[] getCheckImeiInterceptorUrl() {
        List<String> url = new ArrayList<>();
        url.add("/getway/monitoring-watch-shop");

        url.add("/getway/devices/{imei}/wifi");
        url.add("/getway/devices/{imei}/contact");
        url.add("/getway/devices/{imei}/manycontacts");
        url.add("/getway/devices/{imei}/mancontact_class");
        url.add("/getway/devices/{imei}/rail");
        url.add("/getway/devices/ppfriends");
        url.add("/getway/devices/navigation");
        url.add("/getway/devices/{imei}/healthfunction");

        url.add("/getway/chatGroups/{groupid}/message");

        url.add("/getway/inquire/{imei}");

        url.add("/getway/dataflow-monitoring/{imei}");

        url.add("/getway/accounts/{imei}/video");
        url.add("/getway/accounts/{imei}/video_monito");

        url.add("/20000/devices/{imei}/voiceAlarm");
        url.add("/20000/devices/{imei}/disturbBan");
        url.add("/20000/devices/{imei}/operation");
        url.add("/20000/devices/{imei}/location/last");
        url.add("/20000/devices/{imei}/sos");
        //
        url.add("/getway/devices/{imei}/aso");
        url.add("/getway/devices/{imei}/sedentary");
        url.add("/getway/devices/{imei}/cmsg");




        String[] tokenExcludeArray = new String[url.size()];
        url.toArray(tokenExcludeArray);
        return tokenExcludeArray;
    }

}